package string

import (
	"strconv"
	"strings"
	"unicode"
)

//判断是否是回文字符串,通过反转字符串方式，例如：IsPalindrome1("hEle,h") 返回true
func IsPalindrome1(str string) bool {
	//全部转成小写
	str = strings.ToLower(str)
	strByte := []rune(str)
	var newStrByte []rune
	//去除标点符合
	for _, l := range strByte {
		if unicode.IsPunct(l) {
			continue
		}
		newStrByte = append(newStrByte, l)
	}
	//反转字符串后，看看是否原字符串一致
	if ReverseString(string(newStrByte)) == string(newStrByte) {
		return true
	}
	return false
}

//判断是否是回文字符串
//双指针法 通过左右指针,例如：IsPalindrome2("hEle,h") 返回true
func IsPalindrome2(str string) bool {
	//全部转成小写
	str = strings.ToLower(str)
	strByte := []rune(str)
	//定义左右指针
	left := 0
	right := len(strByte) - 1
	for left < right {
		//跳过标点
		if unicode.IsPunct(strByte[left]) {
			left++
		}
		if unicode.IsPunct(strByte[right]) {
			right--
		}
		if strByte[left] != strByte[right] {
			return false
		}
		left++
		right--
	}
	return true
}
//判断是否是回文数
//双指针法 通过左右指针
func IsPalindromeInt(x int) bool {
	//先转成字符串
	str := strconv.Itoa(x)
	strByte := []rune(str)
	//定义左右指针
	left := 0
	right := len(strByte) - 1
	for left < right {
		if strByte[left] != strByte[right] {
			return false
		}
		left++
		right--
	}
	return true
}